在進入陣列、物件和函式的世界前,今天先來試試看猜數字的題目該怎麼解吧!
首先,先宣告我們會使用到的變數
let answer = Math.floor(Math.random() * 100) + 1 // 莊家數字 1-100
let guess = 0 // 電腦初始數字
let count = 0 // 猜數字進行次數
let max = 100 // 猜數字範圍初始最大值
let min = 1 // 猜數字範圍初始最小值
接下來進入迴圈階段,設想的條件設計:
while (guess !== answer) {
guess = Math.floor((min + max) / 2) // 電腦猜的數字從範圍最小到最大值的中數開始進行
count++ // 準備開始比較數字大小,開始計算猜測次數
if (guess > answer) { // 當猜的數字大於答案
console.log(`第 ${count} 次,電腦猜 ${guess},結果 太大`)
max = guess - 1 // 將猜數字的範圍設定在最大值到本輪數字以下為止
} else if (guess < answer) { // 當猜的數字小於答案
console.log(`第 ${count} 次,電腦猜 ${guess},結果 太小`)
min = guess + 1 // 將猜數字的範圍設定在最小值從本輪數字以上開始
}
}
console.log(`第 ${count} 次,電腦猜 ${guess},答案是 ${answer},猜中了!`) // 當數字等於答案便會跳出迴圈輸出猜中了
其實題目有很多種解法,但要記得每次猜測完數字後需要動態調整猜數字的範圍,像是這邊使用Math.floor無條件捨去小數的情況下,如果不調整就會造成電腦猜測某些數字時(如電腦猜測範圍[(99 + 100) / 2] = 99.5,無條件捨去後還是99),會直接踏進無窮迴圈的領域。
既然這裡使用了Math函式庫,就認識一下常用的幾個語法吧!
Math.random()
隨機生成0(含)到1(不含)的數值,可以運用乘上某個數字而調整random()取得的小數範圍
console.log(Math.random() * 100) // 隨機0-100(不含100)間的小數
Math.floor(x)
無條件捨去到整數,很常與random()一起搭配來隨機生成數字,但使用上要注意自己取值的範圍哦(如本次題目需要生成1-100的數字時,記得後面要+1,不然無條件捨去小數生成的範圍只會是0-99間的數字)
console.log(Math.floor(3.141596)) // 3
Math.ceil(x)
也是將小數轉換成整數,但與floor()不同的地方在於它是無條件進位
console.log(Math.ceil(3.141596)) // 4
Math.round(x)
將小數四捨五入轉換成整數
console.log(Math.round(3.141596)) // 3
console.log(Math.round(3.512)) // 4
Math.pow(x, y)
進行x的y次方運算,與x**y相同
console.log(Math.pow(2, 3)) // 2的3次方 8
console.log(2 ** 3) // 8
Math.sqrt(x)
進行x的平方根運算
console.log(Math.sqrt(25)) // 5